package cn.xzqwjw.taskmanager.controller.api;

import cn.xzqwjw.taskmanager.domain.pojo.SysConfig;
import cn.xzqwjw.taskmanager.domain.vo.ResponseVo;
import cn.xzqwjw.taskmanager.service.SysConfigService;
import cn.xzqwjw.taskmanager.utils.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author rush
 */
@RestController
@RequestMapping("/api/config")
@Validated
public class SysConfigController {

  private final SysConfigService configService;

  @Autowired
  public SysConfigController(SysConfigService configService) {
    this.configService = configService;
  }

  /**
   * 处理 "/api/config" 的 POST 请求，添加系统设置
   */
  @PostMapping("")
  public String add(
      @NotNull(message = "参数不能为空")
      @Valid @RequestBody SysConfig config) {
    return configService.add(config);
  }

  /**
   * 处理 "/api/config/batch" 的 POST 请求，批量添加系统设置
   */
  @PostMapping("/batch")
  public String addBatch(
      @RequestBody List<@Valid SysConfig> list) {
    return configService.addBatch(list);
  }

  /**
   * 处理 "/api/config/{id}" 的 DELETE 请求，删除系统设置
   */
  @DeleteMapping("/{id:[0-9]+}")
  public String delById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return configService.delById(id);
  }

  /**
   * 处理 "/api/config" 的 PUT 请求，修改系统设置信息
   */
  @PutMapping("")
  public String modifyAll(
      @NotNull(message = "参数不能为空")
      @Valid @RequestBody SysConfig config) {
    return configService.modifyAll(config);
  }

  /**
   * 处理 "/api/config/10" 的 PATCH 请求，修改某条系统设置的值或者remark
   */
  @PatchMapping("/{id:[0-9]+}")
  public String patchByParams(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id,
      @NotBlank(message = "参数不能为空")
      @RequestBody String paramsJson) {
    return configService.patchByParams(id, paramsJson);
  }

  // ==================== 查询 ====================

  /**
   * 根据id查询某个系统设置的详细信息
   */
  @GetMapping("/{id:[0-9]+}")
  public String queryById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return configService.queryById(id);
  }

  /**
   * 添加/编辑系统设置时要先看看系统设置名是否已经用过
   */
  @GetMapping("/check-label")
  public String checkLabel(
      @NotBlank(message = "参数不能为空")
      @RequestParam(value = "Label") String label,
      @RequestParam(value = "Id", defaultValue = "0") Integer id) {
    return configService.checkLabel(label, id);
  }

  /**
   * 查询某个tag下所有的系统设置
   */
  @GetMapping("/list-all")
  public String listAll(
      @RequestParam(value = "Tag", defaultValue = "") String tag) {
    return configService.listAll(tag);
  }

  /**
   * 后台登录成功后，获取文件上传下载的预定配置
   */
  @GetMapping("/uldl")
  public String getUlDlConfigDefault() {
    return JsonUtil.obj2Json(ResponseVo.success(configService.getUploadConfigDefault()));
  }

}
